// https://leetcode-cn.com/problems/sort-colors/
// 76. 颜色分类
// 给定一个包含红色、白色和蓝色，共 n 个元素的数组 nums，原地对它们进行排序，
// 使得相同颜色的元素相邻，并按照红色、白色、蓝色顺序排列。
// 使用整数 0、1 和 2 分别表示红色、白色和蓝色
// 必须在不使用库的 sort 函数的情况下解决这个问题
function sortColors(nums: number[]): void {
    let p0 = 0;
    let p2 = nums.length - 1;

    for (let i = 0; i <= p2; i++) {
        while (nums[i] === 2 && i <= p2) {
            swap(nums, i, p2);
            p2--;
        }

        if (nums[i] === 0) {
            swap(nums, i, p0);
            p0++;
        }
    }

    function swap(nums: number[], a: number, b: number): void {
        if (a === b) return;
        [nums[a], nums[b]] = [nums[b], nums[a]];
    }
}
